#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
// 函数指针类型
typedef void (*func_t)();
#define NUM 5
func_t handlers[NUM+1];

// 如下是任务
void DownLoad()
{
    printf("我是一个下载的任务...\n");
}
void Flush()
{
    printf("我是一个刷新的任务...\n");
}
void Log()
{
    printf("我是一个记录日志的任务...\n");
}

// 注册
void registerHandler(func_t h[], func_t f)
{
    int i = 0;
    for(; i < NUM; i++)
    {
        if(h[i] == NULL)break;
    }
    if(i == NUM) return;
    h[i] = f;
    h[i+1] = NULL;
}
int main()
{
  registerHandler(handlers, DownLoad);
  registerHandler(handlers, Flush);
  registerHandler(handlers, Log);
  pid_t id = fork();
  //child process
  if(id == 0)
  {
    int cnt = 3;
    while(1)
    {
      sleep(1);
      printf("child process : pid : %d , ppid : %d\n",getpid(),getppid());
      //让子进程异常终止
      //int a = 10;
      //a/= 0;
      //exit(1);
    }
    exit(1);
  }
  sleep(3);
  //parent child
  while(1)
  {
    int status = 0;
    pid_t rid = waitpid(id,&status,WNOHANG);
    if(rid > 0)
    {
      printf("wait success : exitcode : %d , eixtsignal : %d\n",WEXITSTATUS(status),status&0X7F);
      break;
    }
    else if(rid == 0)
    {
      //处理其他任务
      int i = 0;
      for(i = 0; handlers[i]; i++)
      {
        handlers[i]();
      }    
      printf("本次等待结束，子进程没有结束\n");
      sleep(1);
    }
    else 
    {
      printf("wait failed\n");
      break;
    }
  }
  return 0;	
}
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//  //child process
//    while(1)
//    {
//      sleep(1);
//      printf("child process: pid:%d, ppid:%d\n",getpid(),getppid());
//      //异常代码
//      int a = 10;
//      a /= 0;
//      //int* p = 0;
//      //*p = 100;
//    }
//    exit(10);
//  }
//  sleep(5);
//  //parent process
//  int status = 0;
//  pid_t rid = waitpid(id,&status,0);
//  if(rid > 0)
//  {
//    printf("wait succeed: rid: %d , exitcode: %d , exitsig: %d\n",rid,(status>>8)&0XFF,status&0X7F);
//  }
//  else 
//  {
//    printf("wait failed: errno:%d, strerror:%s\n",errno,strerror(errno));
//  }
//  return 0;
//}
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    int cnt=5;
//    while(cnt--)
//    {
//      sleep(1);
//      printf("child process: pid:%d, ppid:%d\n",getpid(),getppid());
//    }
//    exit(0);
//  }
//  sleep(10);
//  //parent process
//  //pid_t rid = wait(NULL);
//  pid_t rid = waitpid(id+1,NULL,0);
//  if(rid > 0)
//  {
//    printf("wait succeed: rid: %d\n",rid);
//  }
//  else 
//  {
//    printf("wait failed: errno:%d, strerror:%s\n",errno,strerror(errno));
//  }
//  sleep(5);
//  return 0;
//}
